#include "homework.h"
//题目名称：
//分数求和
//题目内容：
//计算1 / 1 - 1 / 2 + 1 / 3 - 1 / 4 + 1 / 5 …… + 1 / 99 - 1 / 100 
//的值，打印出结果

//int main() {
//	double total_sum = 0.0;
//	int flag = 1;
//	for (int i = 1; i <= 100; i++) {
//		total_sum += (flag) * (1.0 / i);
//		flag *= -1;
//	}
//	printf("%f\n", total_sum);
//	return 0;
//}


//题目名称：
//求最大值
//题目内容：
//求10 个整数中最大值

//int main() {
//	int arr[10] = { 0 };
//	for (int i = 0; i < 10; i++) {
//		scanf("%d", &arr[i]);
//	}
//	for (int i = 0; i < 10; i++) {
//		printf("%d ", arr[i]);
//	}
//	printf("\n");
//	
//	int max = arr[0];
//	for (int i = 1; i < 10; i++) {
//		if (arr[i] > max) {
//			max = arr[i];
//		}
//	}
//	printf("max = %d\n", max);
//	return 0;
//}

//题目名称：
//乘法口诀表
//题目内容：
//在屏幕上输出9 * 9乘法口诀表

//a * b = c

/*
1*1=1
1*2=2 2*2=4

*/

//int main() {
//	for (int a = 1; a <= 9; a++) {
//		for (int b = 1; b <= a; b++) {
//			printf("%d*%d=%d ", a, b, a * b);
//		}
//		printf("\n");
//	}
//}

//C 程序地址空间
//linux 进程虚拟地址空间

//void swap(int* a, int* b) {
//	int tmp = *a;
//	*a = *b;
//	*b = tmp;
//}
//
//
////0x02B9F920
//int main() {
//	int a = 10;
//	int b = 20;
//	swap(&a, &b);
//	/*
//	* a = 20
//	* b = 10
//	*/
//	printf("%d %d\n", a, b);
//
//	MyPrintf();
//	
//	return 0;
//}
//
//void func2(int b) {
//	printf("%d\n", b);
//}
//
//void func1(int a) {
//	int b = 100;
//	printf("%d\n", a);
//}
//
//int main() {
//	int a = 10;
//	{
//		int aa = 10;
//	}
//	func1(10);
//	return 0;
//}


//#include <math.h>
//
//void Func() {
//    for (int i = 100; i <= 200; i++) {
//        int j = 2;
//        for (; j <= sqrt(i); j++) {
//            if (i % j == 0) {
//                break;
//            }
//        }
//
//        if (j >= sqrt(i)) {
//            printf("%d ", i);
//        }
//    }
//    printf("\n");
//}
//
//int main() {
//    Func();
//    return 0;
//}

//
//乘法口诀表
//题目内容：
//实现一个函数，打印乘法口诀表，口诀表的行数和列数自己指定
//
//如：输入9，输出9 * 9口诀表，输出12，输出12 * 12的乘法口诀表。

//
//void Func(int n) {
//	for (int a = 1; a <= n; a++) {
//		for (int b = 1; b <= a; b++) {
//			printf("%d*%d=%d ", a, b, a * b);
//		}
//		printf("\n");
//	}
//}
//
//int main() {
//	Func(13);
//	return 0;
//}


//题目名称：
//打印一个数的每一位
//题目内容：
//递归方式实现打印一个整数的每一位
/*
1234
1 2 3 4
4 3 2 1
*/
//
//void PrintNum(int n) {
//	if (n > 9) {
//		PrintNum(n / 10);
//	}
//	printf("%d ", n % 10);
//}
////1234
//void PrintNum1(int n) {
//	printf("%d ", n % 10);
//	//12
//	if (n > 9) {
//		PrintNum1(n / 10);
//	}
//}
//
////1 2 3 4
////4 3 2 1
////C:\bite\code\76_class_homework\Debug\homework2.exe(进程 10808)已退出，代码为 0。
////要在调试停止时自动关闭控制台，请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
////按任意键关闭此窗口.
//
//int main() {
//	PrintNum(1234);
//	printf("\n");
//	PrintNum1(1234);
//
//	return 0;
//}


//题目名称：
//求阶乘
//题目内容：
//递归和非递归分别实现求n的阶乘（不考虑溢出的问题）
//
//int Func(int n) {
//	int total = 1;
//	for (int i = n; i >= 1; i--) {
//		total *= i;
//	}
//	return total;
//}
//
//int Func1(int n) {
//	if (n == 0) {
//		return 1;
//	}
//
//	if (n == 1) {
//		return 1;
//	}
//	return n * Func1(n - 1);
//}
//
//int main() {
//	printf("%d\n", Func1(0));
//	return 0;
//}
//
//题目名称：
//strlen的模拟（递归实现）
//题目内容：
//递归和非递归分别实现strlen

//int MyStrlen(const char* str) {
//	int total = 0;
//	while (*str++ != '\0') {
//		total++;
//	}
//	return total;
//}
//
//int MyStrlen1(const char* str) {
//	if (*str == '\0') {
//		return 0;
//	}
//
//	return 1 + MyStrlen1(str + 1);
//}
//
//int main() {
//	printf("%d\n", MyStrlen1("abcdef"));
//	return 0;
//}
//
//题目名称：
//字符串逆序（递归实现）
//题目内容：
//编写一个函数 reverse_string(char* string)（递归实现）
//
//实现：将参数字符串中的字符反向排列，不是逆序打印。
//
//要求：不能使用C函数库中的字符串操作函数。
//
//比如 :
//
//char arr[] = "abcdef";
//逆序之后数组的内容变成：fedcba

void reverse_string(char* str) {
	//1.交换
	//begin_char : 保存的就是字符串的首字符
	char begin_char = *str;

	int str_len = strlen(str);
	*str = *(str + str_len - 1);
	*(str + str_len - 1) = '\0';

	//2.递归
	if (strlen(str + 1)  >= 2) {
		reverse_string(str + 1);
	}

	//3.首字符放到末尾位置
	*(str + str_len - 1) = begin_char;
}

int main() {
	char arr[] = "abcdef";
	reverse_string(arr);
	printf("%s\n", arr);
	return 0;
}



#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>

void menu() {
	printf("***********************************\n");
	printf("**** 1.game *********** 2.exit ****\n");
	printf("***********************************\n");
}
//
//
///*
//* 游戏部分
//*    1.
//*/

#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define MINECOUNT 10

void InitBoard(char arr[][COLS], int rows, int cols, char c) {
	for (int i = 0; i < rows; i++) {
		for (int j = 0; j < cols; j++) {
			arr[i][j] = c;
		}
	}
}

void InterDisplay(char arr[][COLS], int rows, int cols) {
	for (int i = 0; i < rows; i++) {
		for (int j = 0; j < cols; j++) {
			printf("%c ", arr[i][j]);
		}
		printf("\n");
	}
	printf("-------------------------------------------\n\n");
}

void SetMine(char arr[][COLS]) {
	int mine_count = MINECOUNT;

	while (mine_count > 0) {
		int x = rand() % ROW + 1;
		int y = rand() % COL + 1;

		if (arr[x][y] == '0') {
			arr[x][y] = '1';
			mine_count--;
		}
	}
	
}

void ShowBoard(char arr[][COLS]) {
	//第0行 输出 0 1 2 3 4 5 6 7 8 9
	for (int i = 0; i <= COL; i++) {
		printf("%d ", i);
	}
	printf("\n");
	//输出第1行到第9行
	for (int i = 1; i <= ROW; i++) {
		//输出每一行具体的内容
		// 在第0列输出当前行的行号
		// 后续输出dispaly数组对应的内容
		printf("%d ", i);
		for (int j = 1; j <= COL; j++) {
			printf("%c ", arr[i][j]);
		}
		printf("\n");
	}
}

int GetMineCount(char arr[][COLS], int x, int y) {
	return arr[x - 1][y - 1] + arr[x - 1][y] + arr[x - 1][y + 1] +
		arr[x][y - 1] + arr[x][y + 1] +
		arr[x + 1][y - 1] + arr[x + 1][y] + arr[x + 1][y + 1] - 8 * '0';
}

void StartPlay(char user_display[][COLS], char mine_board[][COLS]) {

	int step_count = 0;
	while (step_count < ROW * COL - MINECOUNT) {
		printf("please enter x,y:");
		int x, y;
		scanf("%d,%d", &x, &y);

		if (x >= 1 && x <= 9 && y >= 1 && y <= 9) {
			if (mine_board[x][y] == '1') {
				printf("很遗憾， 踩到雷了， 游戏结束喽~~\n");
				ShowBoard(mine_board);
				break;
			}
			else {
				//1.计算
				int mine_count = GetMineCount(mine_board, x, y);
				printf("mine_count : %d\n", mine_count);
				//2.设置
				user_display[x][y] = mine_count + '0';
				
				//3.展示
				ShowBoard(user_display);

				step_count++;
			}
		}
		else {
			printf("坐标输入错误了， 请重新输入\n");
		}
	}


}

void game() {
	char user_dispaly[ROWS][COLS];
	char mine_board[ROWS][COLS];

	InitBoard(user_dispaly, ROWS, COLS, '?');
	//InterDisplay(user_dispaly, ROWS, COLS);
	InitBoard(mine_board, ROWS, COLS, '0');
	InterDisplay(mine_board, ROWS, COLS);

	//设置雷
	SetMine(mine_board);
	InterDisplay(mine_board, ROWS, COLS);

	//展示棋盘
	ShowBoard(user_dispaly);

	StartPlay(user_dispaly, mine_board);
}

int main() {
	/*
	* 1.游戏开始部分
	*     1.0 展示游戏菜单
	*     1.1 负责接收用户的接收， 判断用户是否游戏或者退出
	*     1.2 可以循环游戏
	*/
	srand((unsigned int)time(NULL));
	int input = -1;
	do {
		//1.0 展示游戏菜单
		menu();

		//1.1 负责接收用户的接收， 判断用户是否游戏或者退出
		printf("please enter youe select:");
		scanf("%d", &input);

		switch (input)
		{
		case 1:
			//进入游戏
			printf("我要玩游戏了， 哈哈哈哈\n");
			game();
			break;
		case 2:
			//退出游戏
			printf("我不玩了， 我要退出了，再见哦~~\n");
			input = 0;
			break;
		default:
			//用户输入有误
			printf("请在1或者2之间选择， 请重新选择！\n");
			break;
		}
	} while (input);
	return 0;
}

